/***********************************************
 @Name :        小铭同学
 @Time :        2025-08-15
 @Email :       LiaoMingWJ233@163.com
 @Comment :     自定义控件 DeepSeek Chat 接口
 @FileName :    deepseek_chat.cpp
 @Version :     1.0
************************************************/


#include "deepseek_chat.h"

Deepseek_Chat::Deepseek_Chat(QObject *parent) : QObject(parent)
{
    // 
    manager = new QNetworkAccessManager(this);
    
    // 初始化聊天信息     模仿官方给的内容 
    QJsonObject system;
    system["role"] = "system";
    system["content"] = "You are a helpful assistant";
    
    // 组装到发送数组中
    messageHistory.append(system);
    
    // 网络完成时连接信号
    connect(manager, &QNetworkAccessManager::finished, this, &Deepseek_Chat::onReplyFinished);
}

void Deepseek_Chat::ask(const QString &userInput)
{
    // 1. 创建一个 JSON 对象，表示用户这次发送的消息
    QJsonObject userMsg;
    userMsg["role"] = "user";                 // 角色是用户（user）
    userMsg["content"] = userInput;           // 角色是用户（user）
    
    // 2. 把这个用户消息追加到聊天记录的 JSON 数组里（保持对话上下文）
    messageHistory.append(userMsg);
    
    // 3. 构造整个请求体的 JSON 对象
    QJsonObject root;
    root["model"] = "deepseek-chat";             // 指定要调用的模型名称
    root["messages"] = messageHistory;           // 把完整的聊天历史放入请求
    root["stream"] = false;                      // 不启用流式响应 ，等待完整回复
    
    // 4. 把 JSON 对象转换成 JSON 格式的 QByteArray （二进制数据）
    QJsonDocument doc(root);
    QByteArray jsonData = doc.toJson();
    
    // 5. 构造网络请求对象，设置请求地址（DeepSeek API 的
    QUrl url(apiUrl);
    QNetworkRequest request(url);
    
    // 6. 设置请求头，告诉服务器请求体是 JSON 格式
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
    
    // 7. 设置请求头的 Authorization，附加 Bearer + API Key 作为身份认证
    request.setRawHeader("Authorization", QString("Bearer %1").arg(apiKey).toUtf8());

    // 8. 使用 QNetworkAccessManager 发送 POST 请求，提交 JSON 数据
     manager->post(request , jsonData);
    
//    // 4. 使用 QNetworkAccessManager 发起 POST 请求
//    QNetworkReply *reply = manager->post(request, jsonData);

//    // 5. 将 reply 的 finished 信号连接到 lambda，捕获 reply
//    connect(reply, &QNetworkReply::finished, this, [this, reply]() {
//        this->onReplyFinished(reply);  // 调用成员函数并传 reply
//        qDebug() << "测试测试11111";
//    });
    
}

void Deepseek_Chat::onReplyFinished(QNetworkReply *reply)
{
    // 1. 检查网络请求是否出错（如无法连接、超时、403 等）
    if (reply->error()) {
        // 如果出错，发出错误信号，将错误信息传给外部使用者
        emit error_signals("网络错误: " + reply->errorString());

        // 释放网络回复资源
        reply->deleteLater();
        return;
    }
    
    
    // 2. 读取服务器返回的所有数据（返回的是 JSON 字符串）
    QByteArray responseData = reply->readAll();

    // 3. 将 JSON 字符串解析为 QJsonDocument 对象
    QJsonDocument doc = QJsonDocument::fromJson(responseData);

    // 4. 获取最外层的 JSON 对象（根节点）
    QJsonObject obj = doc.object();

    // 5. 提取 "choices" 字段，是一个 JSON 数组（chat 结果都在这里）
    QJsonArray choices = obj.value("choices").toArray();

    // 6. 如果 choices 不为空，说明有返回内容
    if (!choices.isEmpty()) {
        // 从第一个 choice 中提取 assistant 的回复文本
        QString replyText = choices.at(0).toObject()
                                      .value("message").toObject()
                                      .value("content").toString();

        // 7. 把 assistant 的回复也加入 messageHistory，形成完整上下文
        QJsonObject assistantMsg;
        assistantMsg["role"] = "assistant";
        assistantMsg["content"] = replyText;
        messageHistory.append(assistantMsg);

        // 8. 发出信号，将 AI 的回复内容传递出去（可以连接到 UI 显示）
        emit replyReady(replyText);
    } else {
        // 如果没有收到 choices，说明返回不完整，报错
        emit error_signals("没有收到有效回复");
    }

    // 9. 最后释放 reply 对象，防止内存泄漏
    reply->deleteLater();
    
}
